/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/cat.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "../msg/head.h"

#include "jsp_supper_variable.h"
#include "jsp_cplusplus.h"
#include "jsp_variable.h"
#include "jsp_declare.h"
#include "jsp_comment.h"
#include "jsp_html.h"

#include "helper_jsp.h"
#include "jsp_proc.h"

namespace jsp2cpp
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    jsp_proc::jsp_proc( helper_jsp * pJsp ) : m_pJsp( pJsp )
    {}

    jsp_proc::~jsp_proc()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::proc()
    {
        int ret = 0;

        if( 0 == ret )
        {
            //ret = add_bom_head();
        }

        if( 0 == ret )
        {
            ret = add_include();
        }

        if( 0 == ret )
        {
            ret = add_declare();
        }

        if( 0 == ret )
        {
            ret = add_page_render_function_head();
        }

        if( 0 == ret )
        {
            ret = to_function();
        }

        if( 0 == ret )
        {
            ret = add_page_render_function_tail();
        }

        if( 0 == ret )
        {
            ret = add_array();
        }

        if( 0 == ret )
        {
            ret = add_tail();
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_bom_head()
    {
        int ret = 0;

        unsigned char buf[3] = { 0 };
        buf[0] = 0xEF;
        buf[1] = 0xBB;
        buf[2] = 0xBF;
        m_pJsp->push_text( ( const char * )buf, sizeof( buf ), JSP_TEXT );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_include()
    {
        int ret = 0;

        xos::i_crt * pCrt = mgr::container()->crt();
        const char * lpszInfo = "\
/*----------------------------------------------------------------------------------------\r\n\
*\r\n\
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.\r\n\
*  https://gitee.com/helloworldghh/cat.git\r\n\
*  Use of this source code is governed by a MIT license\r\n\
*  that can be found in the License file.\r\n\
*\r\n\
----------------------------------------------------------------------------------------*/\r\n\
#include \"../import/head.h\"\r\n\
#include \"../impl/head.h\"\r\n\
#include \"jsp_functions.h\"\r\n\
#include \"page.h\"\r\n\
";

        m_pJsp->push_text( lpszInfo, pCrt->strlen( lpszInfo ), JSP_TEXT );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_declare()
    {
        int ret = 0;

        data::LIST * pList = m_pJsp->declare();
        jsp_declare obj( m_pJsp );

        for( data::ITER iter = pList->begin(); iter != pList->end(); ++iter )
        {
            data * pD = *iter;
            obj.to_declare( pD );
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_page_render_function_head()
    {
        int ret = 0;

        xos::i_crt * pCrt = mgr::container()->crt();

        const char * lpszInfo = "\r\n\
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////page render function begin\r\n\
void page_render( http::i_task * pTask,\r\n\
    http::i_request * pRequest,\r\n\
    http::i_response * pResponse,\r\n\
    xos_box::i_str_property * pReqTag,\r\n\
    xos_box::i_str_property * pResTag )\r\n\
{\r\n\
    using namespace xos_jsp;";

        m_pJsp->push_text( lpszInfo, pCrt->strlen( lpszInfo ), JSP_TEXT );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_page_render_function_tail()
    {
        int ret = 0;

        xos::i_crt * pCrt = mgr::container()->crt();

        const char * lpszInfo = "\r\n\
}\r\n\
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////page render function end\r\n";

        m_pJsp->push_text( lpszInfo, pCrt->strlen( lpszInfo ), JSP_TEXT );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_array()
    {
        int ret = 0;

        xos::i_crt * pCrt = mgr::container()->crt();
        data::LIST * pList = m_pJsp->item();

        if( 0 == ret )
        {
            const char * lpszInfo = "\r\n\
const int g_jsp_body_num = %d;\r\n\
std::string g_strHtmlBuf[g_jsp_body_num];\r\n\
const char * g_pszBase64Html[g_jsp_body_num] = \r\n\
{";
            int nNum = ( int )pList->size();
            char buf[4096] = { 0 };
            int len = mgr::container()->crt()->sprintf( buf, sizeof( buf ), lpszInfo, nNum );
            m_pJsp->push_text( buf, len, JSP_TEXT );
        }

        if( 0 == ret )
        {
            to_array();
        }

        if( 0 == ret )
        {
            const char * lpszInfo = "\r\n\
};";
            m_pJsp->push_text( lpszInfo, pCrt->strlen( lpszInfo ), JSP_TEXT );
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::add_tail()
    {
        int ret = 0;

        xos::i_crt * pCrt = mgr::container()->crt();
        const char * lpszInfo = "\r\n";
        m_pJsp->push_text( lpszInfo, pCrt->strlen( lpszInfo ), JSP_TEXT );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::to_function()
    {
        int ret = 0;

        data::LIST * pList = m_pJsp->item();
        int nIndex = 0;

        for( data::ITER iter = pList->begin(); iter != pList->end(); ++iter )
        {
            data * pD = *iter;
            pD->m_nIndex = nIndex++;
            switch( pD->m_eType )
            {
            case JSP_SUPPER_VARIABLE:
                {
                    jsp_supper_variable obj( m_pJsp );
                    obj.to_function( pD );
                }
                break;
            case JSP_CPLUSPLUS:
                {
                    jsp_cplusplus obj( m_pJsp );
                    obj.to_function( pD );
                }
                break;
            case JSP_VARIABLE:
                {
                    jsp_variable obj( m_pJsp );
                    obj.to_function( pD );
                }
                break;
            case JSP_HTML:
                {
                    jsp_html obj( m_pJsp );
                    obj.to_function( pD );
                }
                break;
            default:
                {
                }
                break;
            }
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int jsp_proc::to_array()
    {
        int ret = 0;

        data::LIST * pList = m_pJsp->item();
        bool bFirst = true;

        for( data::ITER iter = pList->begin(); iter != pList->end(); ++iter )
        {
            data * pD = *iter;
            if( !bFirst )
            {
                m_pJsp->push_text( ",", 1, JSP_TEXT );
            }
            else
            {
                bFirst = false;
            }
            switch( pD->m_eType )
            {
            case JSP_SUPPER_VARIABLE:
                {
                    jsp_supper_variable obj( m_pJsp );
                    obj.to_array( pD );
                }
                break;
            case JSP_CPLUSPLUS:
                {
                    jsp_cplusplus obj( m_pJsp );
                    obj.to_array( pD );
                }
                break;
            case JSP_VARIABLE:
                {
                    jsp_variable obj( m_pJsp );
                    obj.to_array( pD );
                }
                break;
            case JSP_HTML:
                {
                    jsp_html obj( m_pJsp );
                    obj.to_array( pD );
                }
                break;
            default:
                {
                }
                break;
            }
        }

        return ret;
    }

} // jsp2cpp
